import axios from "axios";
import { Toast } from "vant";

// 创建 axios 实例
const service = axios.create({
  baseURL: "/api", // 修改为本地mock接口
  timeout: 10000, // 增加超时时间
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    Toast.loading({
      message: "加载中...",
      duration: 0,
      forbidClick: true,
      loadingType: "spinner",
    });
    // 例如：添加 token
    const token = localStorage.getItem("token");
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    console.log(error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    Toast.clear();
    const res = response.data;
    // 如果返回的状态码不是200，说明接口有问题，应该提示错误信息
    if (res.code !== 200) {
      // 处理错误
      const error = new Error(res.msg || "Error");
      error.code = res.code;
      return Promise.reject(error);
    }
    return res;
  },
  (error) => {
    // 处理 HTTP 错误响应
    let message = "请求失败";
    if (error.response) {
      // 服务器返回错误状态码
      switch (error.response.status) {
        case 400:
          message = error.response.data.msg || "请求参数错误";
          break;
        case 401:
          message = "未授权，请重新登录";
          // 可以在这里处理登录过期的逻辑
          break;
        case 403:
          message = "拒绝访问";
          break;
        case 404:
          message = "请求错误，未找到该资源";
          break;
        case 500:
          message = "服务器错误";
          break;
        default:
          message = error.response.data.msg || "服务器响应错误";
      }
    } else if (error.request) {
      // 请求已经发出，但没有收到响应
      if (error.message.includes("timeout")) {
        message = "请求超时，请重试";
      } else {
        message = "网络错误，请检查网络连接";
      }
    }

    error.message = message;
    console.error("请求错误:", message);
    return Promise.reject(error);
  }
);

// 封装 GET 请求
export function get(url, params) {
  return service({
    url,
    method: "get",
    params,
  });
}

// 封装 POST 请求
export function post(url, data) {
  return service({
    url,
    method: "post",
    data,
  });
}

// 封装 PUT 请求
export function put(url, data) {
  return service({
    url,
    method: "put",
    data,
  });
}

// 封装 DELETE 请求
export function del(url, params) {
  return service({
    url,
    method: "delete",
    params,
  });
}

export default service;
